﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public MustInherit Class ObjektKO
    Public LichtfarbeNormal, LichtfarbeGabe, LichtfarbeSpezial, LichtfarbeDoppel As Color
    Public Const Radius As Integer = 3
    Public Const HybridOutsideBoost As Single = 0.5
    Structure StringUndZahl
        Public ID As String
        Public Wert As Single
        Public Sub New(ByVal ID As String, ByVal Wert As Single)
            Me.ID = ID
            Me.Wert = Wert
        End Sub
        Public Sub New(ByVal Gesamt() As String)
            Me.ID = Gesamt(0)
            Me.Wert = Gesamt(1)
        End Sub
        Public Overrides Function ToString() As String
            Return ID + "_" + Wert.ToString
        End Function

    End Structure
    Public Enum RocketAnimations
        METEOR
        RAKETE
        LAND
        NUKLEAR
    End Enum

#Region "Gabe"
    Enum Gabemodi
        Keine
        Gabe
        Spezialgabe
        Doppelgabe
    End Enum
    Enum Effekte
        Keiner
        Schock
        Nuklearverseuchung
    End Enum
    Enum KIGabeEinsatzstellen
        RundenAnfang
        RundenEnde
        Beides
    End Enum
    Enum Kampfboni
        No
        Vision
        Indirects
        EnemyAttack
    End Enum
    Enum Bewegungsarten
        Sonne
        Regen
        Schnee
        Sandsturm
        Eins
    End Enum
    Enum ReperaturGebaeude
        Own
        Allied
        OwnAndEnemy
        OwnAndNeutral
        AlliedAndEnemy
        AlliedAndNeutral
        AlliedAndEnemyAndNeutral
        OwnAndEnemyAndNeutral
    End Enum
    Private Gabemodis As Gabemodi
    Public Property Gabemodus() As Gabemodi
        Get
            Return Gabemodis
        End Get
        Set(ByVal value As Gabemodi)
            Gabemodis = value
        End Set
    End Property
    Private Gabeleist As Integer
    Public Property Gabeleiste() As Integer
        Get
            Return Gabeleist
        End Get
        Set(ByVal value As Integer)
            Gabeleist += value * Gabenfueller
            If Gabeleist > (SpezialgabeKosten + Gabekosten) * Sternkosten Then
                Gabeleist = (SpezialgabeKosten + Gabekosten) * Sternkosten
            End If
        End Set
    End Property
    Public Gabekosten As Integer
    ''' <summary>
    ''' Die Spezialgabe Sterne
    ''' </summary>
    ''' <remarks></remarks>
    Public SpezialgabeKosten As Integer
    ''' <summary>
    ''' Music played during Power ""-Default-Music
    ''' </summary>
    ''' <remarks></remarks>
    Public Gabemusik As String = ""
    ''' <summary>
    ''' Music played during Super-Power ""-Default-Music
    ''' </summary>
    ''' <remarks></remarks>
    Public Spezialgabemusik As String = ""
    ''' <summary>
    ''' Music played during Tag-Power ""-Default-Music
    ''' </summary>
    ''' <remarks></remarks>
    Public Doppelgabemusik As String = ""
    ''' <summary>
    ''' Wie viel ein Stern kostet
    ''' </summary>
    ''' <remarks></remarks>
    Public Sternkosten As Integer = 0
    ''' <summary>
    ''' So viel teurer werden Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Teurungsrate As Single = 1
    ''' <summary>
    ''' Die Namen der KO Gaben
    ''' </summary>
    ''' <remarks></remarks>
    Public Gaben() As String
    ''' <summary>
    ''' In diesem Bereich werden KO Faehigkeit eingesetzt!!!
    ''' </summary>
    ''' <remarks></remarks>
    Public KORange As Integer = -1
    Public Function GetKORange() As Integer
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Select Case Objektverwalter.Spielfeld.Regeln.KOSystem
                Case KOSysteme.Gabe_Modus
                    Return -1
                Case KOSysteme.CoW_Hybrid
                    If Gabemodus = Gabemodi.Keine Then
                        If (Gabekosten + SpezialgabeKosten) * Sternkosten / 4 <= Gabeleiste Then
                            If (Gabekosten + SpezialgabeKosten) * Sternkosten * 3 / 4 <= Gabeleiste Then
                                If SpezialgabeKosten > 0 Or Gabekosten > 0 Then
                                    Return KORange + 2
                                Else
                                    Return KORange
                                End If
                            Else
                                If SpezialgabeKosten > 0 Or Gabekosten > 0 Then
                                    Return KORange + 1
                                Else
                                    Return KORange
                                End If
                            End If
                        Else
                            Return KORange
                        End If
                    Else
                        Return -1
                    End If
                Case KOSysteme.KO_Modus
                    'KO-Range berechnen
                    If Gabemodus = Gabemodi.Keine Then
                        If (Gabekosten + SpezialgabeKosten) * Sternkosten / 2 <= Gabeleiste Then
                            If (Gabekosten + SpezialgabeKosten) * Sternkosten <= Gabeleiste Then
                                If SpezialgabeKosten > 0 Or Gabekosten > 0 Then
                                    Return KORange + 2
                                Else
                                    Return KORange
                                End If
                            Else
                                If SpezialgabeKosten > 0 Or Gabekosten > 0 Then
                                    Return KORange + 1
                                Else
                                    Return KORange
                                End If
                            End If
                        Else
                            Return KORange
                        End If
                    Else
                        Return -1
                    End If
            End Select
        End If
    End Function
    ''' <summary>
    ''' Die ID dieses KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public KOID As String
    ''' <summary>
    ''' Der Name dieses KO
    ''' </summary>
    ''' <remarks></remarks>
    Public KOname As String
    ''' <summary>
    ''' ID im Objektverwalter Array
    ''' </summary>
    ''' <remarks></remarks>
    Public Bild As Integer
    ''' <summary>
    ''' Um so viel werden Truppen auf Gebaeuden geheilt
    ''' </summary>
    ''' <remarks></remarks>
    Public GebaeudeHeilung As Integer = 2
    ''' <summary>
    ''' So viel koennen Fernwaffen weiter schiessen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Reichweite As Integer = 0
    ''' <summary>
    ''' Bonus zum Besetzen von Gebaeuden
    ''' </summary>
    ''' <remarks></remarks>
    Public Besetzer As Single = 0
    ''' <summary>
    ''' Das Glueck des KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Glueck As Integer = 5
    ''' <summary>
    ''' Das Pech des KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Pech As Integer = 0
    ''' <summary>
    ''' Geld welches man pro Stadt mehr bekommt
    ''' </summary>
    ''' <remarks></remarks>
    Public BonusGeldproGebaeude As Integer = 0
    ''' <summary>
    ''' Senkung der Treibstoffkosten in der Luft
    ''' </summary>
    ''' <remarks></remarks>
    Public SpritsenkungLuft As Integer = 0
    ''' <summary>
    ''' Senkung der Treibstoffkosten auf See
    ''' </summary>
    ''' <remarks></remarks>
    Public SpritsenkungSee As Integer = 0
    ''' <summary>
    ''' Um wie viel die Feuerkraft steigt je nach Landschaftsuntergrund
    ''' </summary>
    ''' <remarks></remarks>
    Public LandschaftsStaerke As Integer = 0
    ''' <summary>
    ''' Eine TerrainID oder "Deckung" erhoeht die Feuerkraft je nach LandschaftsStaerke
    ''' </summary>
    ''' <remarks></remarks>
    Public LandschaftsUntergrund() As String = {}
    ''' <summary>
    ''' Feuerstaerke aller Truppen.
    ''' </summary>
    ''' <remarks></remarks>
    Public OffensivStaerke As ObjektTabelle = Nothing
    ''' <summary>
    ''' Deffensive Staerke aller Truppen.
    ''' </summary>
    ''' <remarks></remarks>
    Public DeffensivStaerke As ObjektTabelle = Nothing
    ''' <summary>
    ''' Wenn true dann werden KP und Ladung versteckt
    ''' </summary>
    ''' <remarks></remarks>
    Public Verstecker As Boolean = False
    ''' <summary>
    ''' Um so viel wird die ATK bei einem Wetter erhoeht
    ''' </summary>
    ''' <remarks></remarks>
    Public Wetterbouns As Integer = 0
    ''' <summary>
    ''' Bei diesem Wetter wird die ATK erhoeht um Wetterbonus
    ''' </summary>
    ''' <remarks></remarks>
    Public Wetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne
    ''' <summary>
    ''' Bei diesem Wetter aendern sich die Bewegungspunkte
    ''' </summary>
    ''' <remarks></remarks>
    Public Bewegunssenker() As ObjektSpielfeld.Wetterarten = {}
    ''' <summary>
    ''' Auf diesen Wert werden die Bewegungspunkte gesetzt
    ''' </summary>
    ''' <remarks></remarks>
    Public Bewegungswetter() As Bewegungsarten = {}
    ''' <summary>
    ''' Um wie viel die Reichweite bei bestimmten Wetterarten sich aendern
    ''' </summary>
    ''' <remarks></remarks>
    Public WetterReichweitenbonus() As Integer = {-1}
    ''' <summary>
    ''' Bei welchem Wetter die Reichweitenaenderung stattfindet.
    ''' </summary>
    ''' <remarks></remarks>
    Public WetterartfuerSenker() As ObjektSpielfeld.Wetterarten = {ObjektSpielfeld.Wetterarten.Sandsturm}
    ''' <summary>
    ''' Der Boost pro Sende Turm
    ''' </summary>
    ''' <remarks></remarks>
    Public SendeTurmStaerke As Point = New Point(10, 0)
    ''' <summary>
    ''' Zusatzdeffensive bei Direkt und Indirekten Angriffen
    ''' </summary>
    ''' <remarks></remarks>
    Public Zusatzdeffensive As New Point
    ''' <summary>
    ''' Wie schnell sich die Gabeleiste auffuellt
    ''' </summary>
    ''' <remarks></remarks>
    Public Gabenfueller As Single = 1
    ''' <summary>
    ''' Die Hintergrundmusik dieses KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Musik As String = "Andy"
    ''' <summary>
    ''' Die Armee des KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Armee As String = Armeen.OS.ToString
    ''' <summary>
    ''' Fuer so viel Fonds steigt die Feuerkraft
    ''' </summary>
    ''' <remarks></remarks>
    Public Geldstaerke As Integer = -10
    ''' <summary>
    ''' Klaut dem Gegner Fonds fuer jeden Angriff
    ''' </summary>
    ''' <remarks></remarks>
    Public Geldraub As Single = -1
    ''' <summary>
    ''' Die Synergie nur waehrend der Doppelgabe ungleich 0
    ''' </summary>
    ''' <remarks></remarks>
    Public Synergie As Integer = 0
    ''' <summary>
    ''' Deckungsaenderung pro Stern
    ''' </summary>
    ''' <remarks></remarks>
    Public DeckungsAenderung As Integer = 1
    ''' <summary>
    ''' Offensiv Erhoehung fuer Nah-und Fernkaempfer
    ''' </summary>
    ''' <remarks></remarks>
    Public Zusatzoffensive As New Point
    ''' <summary>
    ''' Sichtbonus fuer alle Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sichtbonus As Integer = 0
    ''' <summary>
    ''' Wenn groesser Null fuehren wir einen zweiten Angriff mit n-facher Staerke des Startangriffes aus.
    ''' </summary>
    ''' <remarks></remarks>
    Public DoppelAngriff As Single = 0
    ''' <summary>
    ''' Wir nehmen keinen Gegenschaden.
    ''' </summary>
    ''' <remarks></remarks>
    Public KeinGegenSchaden As Boolean = False
    ''' <summary>
    ''' Fernwaffen koennen ziehen und feuern.
    ''' </summary>
    ''' <remarks></remarks>
    Public MoveandFire As Boolean = False
    ''' <summary>
    ''' Bonus fuer Truppen die sich mehr bewegen koennen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Bewegungsbonus As BewegungsboniTabelle = Nothing
    ''' <summary>
    ''' Bonus fuer Truppen wenn feinde gesehen werden usw.
    ''' </summary>
    ''' <remarks></remarks>
    Public Kampfbonus As Kampfboni = Kampfboni.No
    ''' <summary>
    ''' Bonus pro Truppe die den Kampfbonus erfuellt.
    ''' </summary>
    ''' <remarks></remarks>
    Public StaerkebonusproEinheit As Integer = 0
    ''' <summary>
    ''' Truppen haben KP+Kampfverstaerker Angriffskraft.
    ''' </summary>
    ''' <remarks></remarks>
    Public Kampfverstaerker As Integer = 0
    ''' <summary>
    ''' Wenn groesser Null kann man nur noch einen N-Ten Bruchteil des Lebens abziehen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Maximalschaden As Single = -1
    ''' <summary>
    ''' Fernwaffen koennen Feuern und ziehen
    ''' </summary>
    ''' <remarks></remarks>
    Public FireandMove As Boolean = False
    ''' <summary>
    ''' Mit dieser Zahl wird der KOnterschaden multipliziert
    ''' </summary>
    ''' <remarks></remarks>
    Public GegenFeuerkraft As Single = 1
    ''' <summary>
    ''' Wenn groesser Null entzieht man dem Gegner Leben
    ''' </summary>
    ''' <remarks></remarks>
    Public Lebensentzug As Single = 0
    ''' <summary>
    ''' Wenn true kann man auch die Komma Zahl des Lebens sehen
    ''' </summary>
    ''' <remarks></remarks>
    Public GenauesLebenAnzeigen As Boolean = False
    ''' <summary>
    ''' Der Spieler dem der KO zugeordnet ist
    ''' </summary>
    ''' <remarks></remarks>
    Public Spieler As Integer = -1
    ''' <summary>
    ''' Einheiten koennen nach ihrem Bau ziehen.
    ''' </summary>
    ''' <remarks></remarks>
    Public NachBauZiehen As Boolean = False
    ''' <summary>
    ''' Der erste Punkt bedeutet die Feuerkraftsteigerung, wenn Gruppen von X Einheiten oder mehr Angegriffen werden und eine Steigerung um Y.
    ''' Der zweite Punkt bedeutet die Feuerkraftsteigerung, wenn Gruppen von X Einheiten oder weniger Angegriffen werden und eine Feuerkraftsteigerung um Y.
    ''' Der Radius sind immer 3 Felder.
    ''' </summary>
    ''' <remarks></remarks>
    Public GruppenBoost As Point() = {New Point(0, 0), New Point(0, 0)}
    ''' <summary>
    ''' X=ATK Steigerung Y Radius wie weit man vom Berg weg sein darf, kann
    ''' </summary>
    ''' <remarks></remarks>
    Public Bergbonus As Point = New Point(0, 0)
    ''' <summary>
    ''' Wenn wir Schaden nehmen bekommen wir etwas Geld zurueck.
    ''' </summary>
    ''' <remarks></remarks>
    Public GeldFuerEigenSchaden As Single = 0
    ''' <summary>
    '''X=1 dann True muessen wir den Kriegsnebel wieder zuruecksetzen X=0 Nichts passiert
    '''Y= Resttage.
    ''' </summary>
    ''' <remarks></remarks>
    Public KriegsnebelErstellung As New Point
    ''' <summary>
    ''' Wenn True dann kann man immer in Waelder und Riffe schauen.
    ''' </summary>
    ''' <remarks></remarks>
    Public RiffWaldSchauer As Boolean = False
    ''' <summary>
    ''' Wenn Einkommen groesser Fonds verliert man die Werte, wenn groesser gewinnt man sie fuer jede 10%
    ''' X=ATK Y=Kosten.
    ''' </summary>
    ''' <remarks></remarks>
    Public ATKundKostensteigererfuerFonds As Point = New Point(0, 0)
    ''' <summary>
    ''' Umso viel wird fuer jede Mine die Produktionskosten gesenkt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Minenstaerke As Single = 0.05#
    ''' <summary>
    ''' Wenn ungleich 0 dann nimmt der Gegner Schaden wenn wir angegriffen wurden umso mehr Schaden wir erlitten haben.
    ''' </summary>
    ''' <remarks></remarks>
    Public ErhoehterGegenschadenbeiEigenSchaden As Single = 0
    ''' <summary>
    ''' Wenn true koennen die eigenen Truppen nur von Einheiten die gleich viel oder mehr gekostet haben Angegriffen werden.
    ''' </summary>
    ''' <remarks></remarks>
    Public KeinAngriffmitBilligerenTruppen As Boolean = False
    ''' <summary>
    ''' Wenn true dann haben wir maximales Glueck wenn der Gegner dadurch zerstoert wuerde.
    ''' </summary>
    ''' <remarks></remarks>
    Public MaxGlueckbeiZerstoerung As Boolean = False
    ''' <summary>
    ''' Je weniger TP umso schlechter kaempfen wir.
    ''' </summary>
    ''' <remarks></remarks>
    Public ZusaetlicheKampfschwaecheproTP As Integer = 0
    ''' <summary>
    ''' Wenn true hat man immer Maximales Glueck.
    ''' </summary>
    ''' <remarks></remarks>
    Public ImmerMaxGlueck As Boolean = False
    ''' <summary>
    ''' Umso viel steigt der Angriff bei Angriffen auf eine bestimmte Landschaft
    ''' </summary>
    ''' <remarks></remarks>
    Public AufLandschaftsStaerke As Integer = 0
    ''' <summary>
    ''' Die Landschaften auf die man schiessen muss.
    ''' </summary>
    ''' <remarks></remarks>
    Public AufLandschaftsUntergrund() As String = {}
    ''' <summary>
    ''' Wir richten immer so viel mehr Schaden aus.LOL.
    ''' </summary>
    ''' <remarks></remarks>
    Public FesterZusatzschadenUndDeffensive As New Point(0, 0)
    ''' <summary>
    ''' Der Spieler verdient so viel Geld mehr oder weniger.
    ''' </summary>
    ''' <remarks></remarks>
    Public MehrEinkommen As Single = 0
    ''' <summary>
    ''' Fuer jede Deckung unseres Gegner sind wir so viel staerker.
    ''' </summary>
    ''' <remarks></remarks>
    Public FeuerstaerkeproFeindlicherDeckung As Integer = 0
    ''' <summary>
    ''' Wenn die TP des Gegner kleiner sind als die eigenen kaempfen die Truppen besser.
    ''' </summary>
    ''' <remarks></remarks>
    Public ATKHochfuerSchwacheGegner As Single = 0
    ''' <summary>
    ''' Die Bewegungskosten auf diesen Feldern ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public NeueBewegungskosten As Integer() = {}
    ''' <summary>
    ''' Auf dieser Landschaft sind die Bewegungskosten X
    ''' </summary>
    ''' <remarks></remarks>
    Public BewegungskostenUntergrund As String() = {}
    ''' <summary>
    ''' Wenn der Schaden groesser X ist fliegt die Einheit Y Felder weg.=) und nimmt dabei Schaden
    ''' </summary>
    ''' <remarks></remarks>
    Public Schadensflug As New Point(0, 0)
    ''' <summary>
    ''' Wenn unser Feind so wenig TP hat oder weniger dann wird er gelaehmt
    ''' </summary>
    ''' <remarks></remarks>
    Public Laehmschaden As Integer = -1
    ''' <summary>
    ''' Wenn unsere Einheit ueberlebt bekommen wir am Kampfende so viel TP zurueck wenn wir zerstoert werden nimmt unser Gegner so viel Schaden.
    ''' </summary>
    ''' <remarks></remarks>
    Public KampfSchadenHeilung As Integer = 0
    ''' <summary>
    ''' Wir erhalten eine Zusatzdeffensive Y und Zusatzoffensive X wenn wir einen Feind zerstoeren.
    ''' </summary>
    ''' <remarks></remarks>
    Public ATKDEFBoostdurchZerstoerung As New Point(0, 0)
    ''' <summary>
    ''' Eine zufaellige Einheit erhaelt Y Bewegungspunkte und X ATK Boost
    ''' </summary>
    ''' <remarks></remarks>
    Public AnyUnitKampfverstaerker As New Point(0, 0)
    ''' <summary>
    ''' Wenn ungleich Null erhaeht sich die ATK um den Wert und die Einheit kann noch mal ziehen.
    ''' </summary>
    ''' <remarks></remarks>
    Public NochMalZiehenUndKampfaenderNachZerstoerung As Integer = 0
    ''' <summary>
    ''' Wenn True erhalten Feinde keine Infos ueber die Gabeleiste
    ''' </summary>
    ''' <remarks></remarks>
    Public GabeleistenVerstecker As Boolean = False
    ''' <summary>
    ''' Wenn True machen wir einen Angriff wenn wir in eine Falle laufen.
    ''' </summary>
    ''' <remarks></remarks>
    Public FallenAngriff As Boolean = False
    ''' <summary>
    ''' Wenn True koennen Gegner keine Einsicht in die Fonds nehmen
    ''' </summary>
    ''' <remarks></remarks>
    Public KeineFondsInfos As Boolean = False
    ''' <summary>
    ''' Wenn True koennen angegriffene Truppen sich in der naechsten Runde nicht reparieren
    ''' </summary>
    ''' <remarks></remarks>
    Public ReperaturVerbotNachKampf As Boolean = False
    ''' <summary>
    ''' Wenn kleiner Null wird die Besetzungszahl eines Gebaeudes gesenkt, wenn eine Einheit drauf vernichtet wird.
    ''' </summary>
    ''' <remarks></remarks>
    Public BesetzungsbonusNachEinheitenZerstoerung As Integer = 0
    ''' <summary>
    ''' X Gibt an auf welchen Wert Wenn Y=1 dann Eigene, wenn Y=2 dann Feind bei Y=0 nichts
    ''' </summary>
    ''' <remarks></remarks>
    Public BewegungsKostenAenderungNachZerstoerung As Point = New Point(0, 0)
    ''' <summary>
    ''' X,Y ist der Ort des Gebaeudes und Z ist die Senkungszahl.
    ''' </summary>
    ''' <remarks></remarks>
    Public BonusGebaeude As Vector3() = {}
    ''' <summary>
    ''' Diese Einheiten kosten mehr oder weniger.
    ''' </summary>
    ''' <remarks></remarks>
    Public BonusEinheiten() As StringUndZahl = {}
    ''' <summary>
    ''' X=Staerke Y=Schaden fuer den jeweils Staerke verursacht wird.
    ''' </summary>
    ''' <remarks></remarks>
    Public RadioaktiveStaerke As Point = New Point(0, 0)
    ''' <summary>
    ''' Bestimmt wann die KI ihre Gabeeinsetzt
    ''' </summary>
    ''' <remarks></remarks>
    Public GabeEinsatzstelle As KIGabeEinsatzstellen = KIGabeEinsatzstellen.RundenAnfang
    ''' <summary>
    ''' Gibt zurueck wie viele Felder wir maximal Laufen koennen damit wir eine Feldtarnung erhalten
    ''' </summary>
    ''' <remarks></remarks>
    Public FeldtarnungsReichweite As Integer = -1
    ''' <summary>
    ''' Landschaften in der ersten Dimension bekommen die Bewegungskosten der Landschaft in der 2 Dimension.
    ''' Olaf Schnee in Ebene verwandeln.
    ''' </summary>
    ''' <remarks></remarks>
    Public LandschaftsVertauschung(,) As String = {}
    ''' <summary>
    ''' Nahkampf Einheiten erhalten einen Fernkampf. Ausser Bomber und Zeppelin
    ''' </summary>
    ''' <remarks></remarks>
    Public NahkampfReichweitenBonus As Integer = 0
    ''' <summary>
    ''' Welche Gebaeude unsere Truppen reparieren.
    ''' </summary>
    ''' <remarks></remarks>
    Public RepairON As ReperaturGebaeude = ReperaturGebaeude.Own
    ''' <summary>
    ''' Sagt auf welchen Gebaeuden der KO bauen kann.
    ''' </summary>
    ''' <remarks></remarks>
    Public Baugebaeude As ReperaturGebaeude = ReperaturGebaeude.Own
    ''' <summary>
    ''' Wenn false verliert der KO keine Feuerkraft wenn die TP sinken.
    ''' </summary>
    ''' <remarks></remarks>
    Public FeuerVerlustbeiKP As Boolean = True
    ''' <summary>
    ''' Gebaeude Heilen und richten mehr Schaden an wenn groesser Null
    ''' </summary>
    ''' <remarks></remarks>
    Public GebaeudeZusatzSchaden As Integer = 0
    ''' <summary>
    ''' Wenn true werden alle Sprites zu Infis und der Schaden wird falsch angezeigt.
    ''' </summary>
    ''' <remarks></remarks>
    Public SpriteVertauschung As Boolean = False
    ''' <summary>
    ''' Bei diesem Wetter sind die Truppen ohne Auswirkung.
    ''' </summary>
    ''' <remarks></remarks>
    Public Wetterimmunitaet As ObjektSpielfeld.Wetterarten() = {}
    ''' <summary>
    ''' Units get Damage after they moved.
    ''' </summary>
    ''' <remarks></remarks>
    Public MoveDamage As Integer
    ''' <summary>
    ''' If a Unit takes more Damage than below, it can't move.
    ''' </summary>
    ''' <remarks></remarks>
    Public ParalyzeDamage As Integer = -1
    ''' <summary>
    ''' The more HP we loose the greater the Offence is.
    ''' </summary>
    ''' <remarks></remarks>
    Public HPLooseOffence As Integer
    ''' <summary>
    ''' Die normale Bewegungsart
    ''' </summary>
    ''' <remarks></remarks>
    Public BewegungsartenVertauschungOrg As String() = {}
    ''' <summary>
    ''' Die neue Bewegungsart
    ''' </summary>
    ''' <remarks></remarks>
    Public BewegungsartenVertauschungNew As String() = {}
#Region "KO Einheit"
    Public Function GetKOUnit() As ObjektEinheit
        If Objektverwalter.Spielfeld.AktuelleEinheit IsNot Nothing Then
            If Objektverwalter.Spielfeld.AktuelleEinheit.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.AktuelleEinheit.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    Return Objektverwalter.Spielfeld.AktuelleEinheit
                End If
            End If
        End If
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                If E IsNot Nothing Then
                    If E.Spieler = Spieler Then
                        If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                            Return E
                        End If
                    End If
                End If
            Next
        Next
        Return Nothing
    End Function
    Public Sub SetKOEinheit(ByVal E As ObjektEinheit)
        If Not E Is Nothing Then
            E.TruppenStufe = ObjektEinheit.Stufe.KO
        Else
            Select Case Objektverwalter.Spielfeld.Regeln.KOSystem
                Case KOSysteme.Gabe_Modus
                    'Do Nothing
                Case KOSysteme.CoW_Hybrid
                    'Do Nothing
                Case KOSysteme.KO_Modus
                    'Gabeleiste geht zurueck!
                    Gabeleist = 0
            End Select
        End If
    End Sub
    Public Function GetKOZoneBoost(ByVal X As Integer, ByVal Y As Integer) As Single
        If X < 0 Or Y < 0 Then Return 1
        Dim KOEinheit As ObjektEinheit = GetKOUnit()
        If GetKORange() >= 0 Then
            Select Case Objektverwalter.Spielfeld.Regeln.KOSystem
                Case KOSysteme.Gabe_Modus
                    Return 1
                Case KOSysteme.CoW_Hybrid
                    If KOEinheit Is Nothing Then
                        Return HybridOutsideBoost
                    Else
                        If Not Objektverwalter.Spielfeld.Landschaften(KOEinheit.X, KOEinheit.Y, KOEinheit.GetMap).Hidden Then
                            If KOEinheit.GetDistance(New Point(X, Y)) <= KORange Then
                                Return 1
                            Else
                                Return HybridOutsideBoost
                            End If
                        Else
                            Return HybridOutsideBoost
                        End If
                    End If
                Case KOSysteme.KO_Modus
                    If KOEinheit Is Nothing Then
                        Return 0
                    Else
                        If Not Objektverwalter.Spielfeld.Landschaften(KOEinheit.X, KOEinheit.Y, KOEinheit.GetMap).Hidden Then
                            If KOEinheit.GetDistance(New Point(X, Y)) <= KORange Then
                                Return 1
                            Else
                                Return 0
                            End If
                        Else
                            Return 0
                        End If
                    End If
                Case Else
                    Return 1
            End Select
        Else
            Return 1
        End If
    End Function
    Public Function GetKOZoneBoost(ByVal Einheit As ObjektEinheit) As Single
        Return GetKOZoneBoost(Einheit.X, Einheit.Y)
    End Function
    Public Function KOBoostApply(ByVal Einheit As ObjektEinheit) As Single
        Return KOBoostApply(Einheit.X, Einheit.Y)
    End Function
    Public Function KOBoostApply(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Select Case Objektverwalter.Spielfeld.Regeln.KOSystem
            Case KOSysteme.Gabe_Modus
                Return True
            Case KOSysteme.CoW_Hybrid
                If GetKOZoneBoost(X, Y) >= HybridOutsideBoost Then
                    Return True
                End If
            Case KOSysteme.KO_Modus
                If GetKOZoneBoost(X, Y) > 0 Then
                    Return True
                End If
        End Select
        Return False
    End Function
#End Region
#End Region
    Public Sub New(ByVal Spieler As Integer, ByVal GabeEinsatzstelle As KIGabeEinsatzstellen)
        Me.Spieler = Spieler
        Me.GabeEinsatzstelle = GabeEinsatzstelle

        'Fuer 3D
        LichtfarbeNormal = Color.White
        LichtfarbeGabe = Color.Yellow
        LichtfarbeSpezial = Color.Red
        LichtfarbeDoppel = Color.Blue
    End Sub
    Public Sub New(ByVal Spieler As Integer, ByVal Gabefuellstand As Integer, ByVal Gabenart As Gabemodi, ByVal neuSternkosten As Integer, ByVal GabeEinsatzstelle As KIGabeEinsatzstellen)
        Gabeleist = Gabefuellstand
        Gabemodus = Gabenart
        Sternkosten = neuSternkosten
        Me.Spieler = Spieler
        Me.GabeEinsatzstelle = GabeEinsatzstelle

        'Fuer 3D
        LichtfarbeNormal = Color.FromArgb(255, 255, 255)
        LichtfarbeGabe = Color.FromArgb(200, 255, 255)
        LichtfarbeSpezial = Color.FromArgb(255, 200, 255)
        LichtfarbeDoppel = Color.FromArgb(255, 255, 200)
    End Sub
    Public Sub Write(ByRef StrW As Filestream)
        Dim B(3) As Byte
        Dim V As Byte = 0
        If Gabeleist = 0 And Sternkosten = 1000 And Gabemodus = Gabemodi.Keine Then
            V = 0 'Version 0
        Else
            V = 1 'Version 1
        End If
        StrW.WriteByte(V)
        WriteString(StrW, KOID)
        B = IntToBytes(Spieler)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        If V >= 1 Then
            StrW.WriteByte(Gabemodus)
            B = IntToBytes(Gabeleist)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Sternkosten)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End If
    End Sub
    Public Shared Function Read(ByRef StrR As Filestream) As ObjektKO
        Dim B(3) As Byte
        Dim V As Byte = StrR.ReadByte
        Dim KOID As String = ReadString(StrR)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Dim Spieler As Integer = BytesToInt(B)
        If V >= 1 Then
            Dim Gabemodus As Gabemodi = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Dim Gabeleist As Integer = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Dim Sternkosten As Integer = BytesToInt(B)
            Return ObjektLadeklasse.NewKO(KOID, Spieler, Gabeleist, Gabemodus, Sternkosten)
        Else
            Return ObjektLadeklasse.NewKO(KOID, Spieler)
        End If
    End Function
    Public MustOverride Sub KOLaden()
    Public Overridable Function GetBaublockade(ByVal Spieler As Integer) As Baublockade
        Return New Baublockade(Baublockade.BauBlockade.Normal, Spieler)
    End Function
    Protected Function GetBildID() As Integer
        For I = 0 To Objektverwalter.GetKOLength() - 1
            If Objektverwalter.GetKO(I).KOID = KOID Then
                Return I
            End If
        Next
        Return 0
    End Function
#Region "Draw CO"
    Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer)
        Objektverwalter.GetKO(Bild).KOGesichtsausdruckMalen(Emotion, X, Y)
    End Sub
    Public Sub KOMalen(ByVal X As Integer, ByVal Y As Integer)
        Objektverwalter.GetKO(Bild).KOMalen(X, Y)
    End Sub
    Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal StartX As Integer, ByVal Hoehe As Integer)
        Objektverwalter.GetKO(Bild).KOGesichtsausdruckMalen(Emotion, X, Y, StartX, Hoehe)
    End Sub
    Public Sub MiniGesichtMalen(ByVal X As Integer, ByVal Y As Integer, ByVal Links As Boolean)
        Objektverwalter.GetKO(Bild).MiniGesichtMalen(X, Y, Links)
    End Sub
#End Region
    Public Function GetOffensivStaerke(ByVal Einheit As ObjektEinheit) As Integer
        Dim Offensive As Integer = 100
        Dim S As ObjektSpieler = Nothing
        If Spieler > 0 Then
            If Not Objektverwalter.Spielfeld Is Nothing Then
                S = Objektverwalter.Spielfeld.Spieler(Spieler)
            End If
        End If
        If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
            If Not Wetterimmunitaet.Contains(Objektverwalter.Spielfeld.Regeln.Wetter) Then
                'Oh Sandsturm ist in DC\ DoR verdammt heftig
                If Objektverwalter.Spielfeld.Regeln.Wetter = ObjektSpielfeld.Wetterarten.Sandsturm Then
                    Offensive -= 30
                End If
            End If
        End If
        If GetKORange() < 0 Or Hauptmenue.Formmodus <> Hauptmenue.Formmodi.Spiel Then
            'Standard Bonus
            If IsNothing(OffensivStaerke) = False Then
                Offensive = OffensivStaerke.GetWert(Einheit.EinheitenID)
                If Offensive < 0 Then
                    Offensive = 100
                End If
            End If
            'KP Verloren Boost
            Offensive += HPLooseOffence * (10 - Einheit.getKP)

            'Der Wetterbonus wird addiert
            If Not Objektverwalter.Spielfeld Is Nothing Then
                If Wetter = Objektverwalter.Spielfeld.Regeln.Wetter Then
                    Offensive += Wetterbouns
                End If
            End If
            'Der Geldstaerkebonus wird addiert
            If Geldstaerke > 0 Then
                If Not S Is Nothing Then
                    Dim Staerke As Integer = Math.DivRem(S.Fonds, Geldstaerke, 0)
                    Offensive += Staerke * 10
                End If
            End If
            Offensive += Synergie
            If Not S Is Nothing Then
                If ATKundKostensteigererfuerFonds.X <> 0 Then
                    Dim Einnahmen As Integer = S.Einkommen()
                    If Einnahmen > S.Fonds Then
                        Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                        Offensive -= Math.DivRem(Einnahmen - S.Fonds, EinnahmenProzent, 0) * ATKundKostensteigererfuerFonds.X
                    ElseIf Einnahmen < S.Fonds Then
                        Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                        Offensive += Math.DivRem(S.Fonds - Einnahmen, EinnahmenProzent, 0) * ATKundKostensteigererfuerFonds.X
                    End If
                End If
            End If

        End If
        If Not S Is Nothing Then
            If S.KOS(0).KOBoostApply(Einheit.X, Einheit.Y) Then
                Offensive += S.GetGebaeude(ObjektSpieler.Gebaeudesuche.Sendetuerme) * SendeTurmStaerke.X
            Else
                Offensive += S.GetGebaeude(ObjektSpieler.Gebaeudesuche.Sendetuerme) * 10
            End If
        End If
        'Es koennte passieren das die Offensie null wird das sollte nicht passieren.
        If Offensive < 0 Then
            Offensive = 0
        End If
        Return Offensive
    End Function
    Public Function GetDeffensivStaerke(ByVal Einheit As ObjektEinheit) As Integer
        Dim Deffensive As Integer = 100
        Dim S As ObjektSpieler = Nothing
        If Spieler > 0 Then
            If Not Objektverwalter.Spielfeld Is Nothing Then
                S = Objektverwalter.Spielfeld.Spieler(Spieler)
            End If
        End If

        If GetKORange() < 0 Or Hauptmenue.Formmodus <> Hauptmenue.Formmodi.Spiel Then
            If IsNothing(DeffensivStaerke) = False Then
                Deffensive = DeffensivStaerke.GetWert(Einheit.EinheitenID)
                If Deffensive < 0 Then
                    Deffensive = 100
                End If
            End If
            If Not S Is Nothing Then
                If S.KOS(0).KOBoostApply(Einheit.X, Einheit.Y) Then
                    Deffensive += S.GetGebaeude(ObjektSpieler.Gebaeudesuche.Sendetuerme) * SendeTurmStaerke.Y
                End If
            End If

        End If

        'Wenn unsere Deffensive zu hoch ist sind wir unzerstoerbar und das wuerde die Spiellaune senken.
        Select Case DataSettings.CommanderWarsGameModus
            Case CommanderWarsGameModi.AdvanceWars, CommanderWarsGameModi.AdvanceWars2, CommanderWarsGameModi.AdvanceWarsDS
                If Deffensive > ObjektSpieler.MaximaleDeffensivestaerke Then Deffensive = ObjektSpieler.MaximaleDeffensivestaerke
        End Select
        If Deffensive < 0 Then Deffensive = 0

        Return Deffensive
    End Function
    Public Overridable Function GetPowerScript(ByVal Power As Integer) As KOCustom.Power.PowerScript
        Return Nothing
    End Function
    Public Overridable Function GetCOKosten() As Integer
        'I think most CO's cost 500 Fonds.
        Return 500
    End Function
#Region "Gabe"
    Public Sub PlayGabeFuellMusik(Optional ByVal AlteGabeModus As Gabemodi = Gabemodi.Keine)
        If KannSpezialGabe() Then
            If AlteGabeModus < Gabemodi.Spezialgabe Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\SpezialgabeVoll.wav", False)
            End If
        ElseIf KannGabe() Then
            If AlteGabeModus < Gabemodi.Gabe Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Gabevoll.wav", False)
            End If
        End If
    End Sub
    Public Function KannGabe() As Boolean
        If Objektverwalter.Spielfeld.Spieler(Spieler).Gabeleiste Then
            If Objektverwalter.Spielfeld.Spieler(Spieler).VeraenderteWerte.Gabeeinsatz = True Then
                If Gabekosten > 0 Then
                    If Gabeleiste >= Gabekosten * Sternkosten Then
                        Return True
                    Else
                        Return False
                    End If
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Function KannSpezialGabe() As Boolean
        If Objektverwalter.Spielfeld.Spieler(Spieler).Gabeleiste Then
            If Objektverwalter.Spielfeld.Spieler(Spieler).VeraenderteWerte.Gabeeinsatz = True Then
                If SpezialgabeKosten > 0 Then
                    If Gabeleiste >= (Gabekosten + SpezialgabeKosten) * Sternkosten Then
                        Return True
                    Else
                        Return False
                    End If
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Sub Gabe()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Player " + Spieler.ToString + " uses Power of CO " + KOname + ".")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.GabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * Gabekosten
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal z.B. die KI Hae Hae
            Gabeleist = 0
        End If
        Gabemodus = Gabemodi.Gabe
        Hauptmenue.MusikZufaellig()
        Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
        Dim Text As String = Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze(Zufallszahl(0, Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze.Length - 1))
        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, Text, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
        If Hauptmenue.Aufzeichnungsspulen Then
            Gabeeinsetzen()
        Else
            Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
        End If



        'Ereignis Aufzeichnen.
        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Gabe)

        'Fuer 3D
        Grafikengine.Lichtaendern(LichtfarbeGabe)
    End Sub
    Public Sub Spezialgabe()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Player " + Spieler.ToString + " uses Special Power of CO " + KOname + ".")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.SpezialgabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * (Gabekosten + SpezialgabeKosten)
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal
            Gabeleist = 0
        End If
        Gabemodus = Gabemodi.Spezialgabe
        Hauptmenue.MusikZufaellig()
        Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
        Dim Text As String = Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze(Zufallszahl(0, Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze.Length - 1))
        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, Text, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
        If Hauptmenue.Aufzeichnungsspulen Then
            Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).SpezialGabeeinsetzen()
        Else
            Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
        End If


        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Spezialgabe)

        'Fuer 3D
        Grafikengine.Lichtaendern(LichtfarbeSpezial)
    End Sub
    Public Sub Doppelgabe()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Player " + Spieler.ToString + " uses Tag Power of CO " + KOname + ".")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.DoppelGabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * (Gabekosten + SpezialgabeKosten)
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal
            Gabeleist = 0
        End If
        'Mal schauen ob es Synergien gibt und wenn ja welche!
        Synergie = CInt(CDec(10) * ObjektKOBeschreibung.GetSynergie(Objektverwalter.GetKO(Bild), Objektverwalter.GetKO(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild)))

        Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Synergie = Synergie

        Gabemodus = Gabemodi.Doppelgabe
        Hauptmenue.MusikZufaellig()
        If Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Gabemodus = Gabemodi.Doppelgabe Then
            SpezialGabeeinsetzen()
        Else
            Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
            Dim Saetze() As ObjektKOBeschreibung.DoppelGabesatz = Objektverwalter.GetKO(Bild).KOBeschreibung.Doppelgabesaetze
            Dim MoeglicheSaetze As ObjektKOBeschreibung.DoppelGabesatz() = {}
            For Each Satz In Saetze
                If Satz.KOID1 = Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID Or Satz.KOID2 = Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID Then
                    Array.Resize(MoeglicheSaetze, MoeglicheSaetze.Length + 1)
                    MoeglicheSaetze(MoeglicheSaetze.Length - 1) = Satz
                End If
            Next
            If MoeglicheSaetze.Length > 0 Then
                Dim Satz As Integer = Zufallszahl(0, MoeglicheSaetze.Length - 1)
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(MoeglicheSaetze(Satz).KOID1, MoeglicheSaetze(Satz).KOSatz1, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit) _
                                                                                                       , New ObjektKODialog.KOText(MoeglicheSaetze(Satz).KOID2, MoeglicheSaetze(Satz).KOSatz2, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
            Else
                Dim T1 As String = Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze(Zufallszahl(0, Objektverwalter.GetKO(Bild).KOBeschreibung.Gabesaetze.Length - 1))
                Dim T2 As String = Objektverwalter.GetKO(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild).KOBeschreibung.Gabesaetze(Zufallszahl(0, Objektverwalter.GetKO(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild).KOBeschreibung.Gabesaetze.Length - 1))
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, T1, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit) _
                                                                                                       , New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild, T2, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
            End If
            If Hauptmenue.Aufzeichnungsspulen Then
                SpezialGabeeinsetzen()
            Else
                Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
            End If
        End If

        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Doppelgabe)

        'Fuer 3D
        Grafikengine.Lichtaendern(LichtfarbeDoppel)
    End Sub
    ''' <summary>
    ''' Only for some AI's stops using Eagle's COP!
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Function UseCOP() As Boolean
        Return True
    End Function
    Protected Sub AnimationEigene(ByVal Animation As String, ByRef WZeit As Integer)
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Dim AnimPos As New List(Of Vector3)
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    Next
                Next
            Next
            While AnimPos.Count > 0
                Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
                WZeit += 4
                Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
                AnimPos.RemoveAt(Pos)
            End While
        End If
    End Sub
    Protected Sub AnimationFeindliche(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                AnimPos.Add(New Vector3(X, Y, I))
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigenePanzer(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.Bewegungsart = MovementSorts.Ketten.ToString Or E.Bewegungsart = MovementSorts.Reifen.ToString Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigeneInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.Bewegungsart = MovementSorts.Fuss.ToString Or E.Bewegungsart = MovementSorts.Mech.ToString Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigeneNahkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.MinimaleReichweite = 1 Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigeneFernkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.MaximaleReichweite > 1 Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigeneNahkampfAusserInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.MinimaleReichweite = 1 Then
                                    If Not E.Bewegungsart = MovementSorts.Fuss.ToString And Not E.Bewegungsart = MovementSorts.Mech.ToString Then
                                        AnimPos.Add(New Vector3(X, Y, I))
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationEigeneLuftkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If E.Bewegungsart = MovementSorts.Helikopter.ToString Or E.Bewegungsart = MovementSorts.Flugzeug.ToString Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationAlleAusserInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If IsNothing(E) = False Then
                            If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If Not E.Bewegungsart = MovementSorts.Mech.ToString And Not E.Bewegungsart = MovementSorts.Fuss.ToString Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationNaturFeinde(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnimPos As New List(Of Vector3)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = True Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationNaturEigene(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = True Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                    AnimPos.Add(New Vector3(X, Y, I))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub
    Protected Sub AnimationBombenregen(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        Dim AnimPos As New List(Of Vector3)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude) = True Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    If Not Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Bewegungsart = MovementSorts.Flugzeug.ToString And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.ToString Then
                                        AnimPos.Add(New Vector3(X, Y, I))
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        While AnimPos.Count > 0
            Dim Pos As Integer = Zufallszahl(0, AnimPos.Count - 1)
            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(AnimPos(Pos).X, AnimPos(Pos).Y), True, AnimPos(Pos).Z)
            WZeit += 4
            Objektverwalter.ZuFeldgehen(AnimPos(Pos).X, AnimPos(Pos).Y)
            AnimPos.RemoveAt(Pos)
        End While
    End Sub

    ''' <summary>
    ''' Beendet die Gabenfunktion immer letzter Sub bei Gaben
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub GabeEingesetzt()
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.GetCommanderWarsModus = CommanderWarsGameModi.AdvanceWarsDC Then
                Dim AnzahlSchlachten As Integer = 0
                If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
                For I = 0 To AnzahlSchlachten
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                            If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                                If E IsNot Nothing Then
                                    If E.Spieler = Spieler Then
                                        If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                            E.HatsichBewegt = True
                                        End If
                                    End If
                                End If
                            End If
                        Next
                    Next
                Next
            End If
            'Wir sagen dem Hauptthread das die Musik angehalten werden soll.
            Hauptmenue.MusikAnhalten = True
            Objektverwalter.Spielfeld.Sichterstellen()
        End If
    End Sub

    Public MustOverride Sub Gabeeinsetzen(Optional ByVal OhneFunktion As Boolean = False)
    Public MustOverride Sub SpezialGabeeinsetzen(Optional ByVal OhneFunktion As Boolean = False)
    Public MustOverride Sub KOFrame()
    Public Overridable Sub AfterBattle(ByVal Attacker As ObjektEinheit, ByVal Deffender As ObjektEinheit)

    End Sub

    Public Overridable Sub TagEnde()

    End Sub
    ''' <summary>
    ''' Zaehlt die Besetzungen
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function CountBuildings() As Integer
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Dim Gebaeude As Integer = 0
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                                If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                    If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Keiner Or Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Sendeturm Then
                                        Gebaeude += 1
                                    End If
                                End If
                            End If
                        End If
                    Next
                Next
            Next
            Return Gebaeude
        End If
    End Function
    Public Sub Gabezuruecksetzen()
        If Gabemodus > 0 Then
            Gabemodus = Gabemodi.Keine
            Dim KostenproStern As Integer = Sternkosten
            KOLaden()
            If DataSettings.CommanderWarsGameModus <> CommanderWarsGameModi.AdvanceWarsDC Then
                If DataSettings.CommanderWarsGameModus <> CommanderWarsGameModi.CommanderWars2 Then
                    Sternkosten = KostenproStern + 200
                End If
            End If
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GebaeudeID = "STADT" Then
                                Dim G As GebaeudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                                G.KannBauen = False
                            End If
                            'Die Besetzungszahl wird wieder Hoch gesetzt
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = False Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                                End If
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                            End If
                        End If
                    Next
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Beschaedigt alle Feinde
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub AlleFeindeBeschaedigen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Schaden(X, Y, neuSchaden, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Beschaedigt alle Feinde
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub AlleSeeFeindeBeschaedigen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).IsSeaUnit Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    Schaden(X, Y, neuSchaden, I)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Beschaedigt alle Feinde
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub AlleLuftFeindeBeschaedigen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).IsFlyingUnit Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    Schaden(X, Y, neuSchaden, I)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Beschaedigt alle Feinde
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub AlleBodenFeindeBeschaedigen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).IsGroundUnit Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    Schaden(X, Y, neuSchaden, I)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Heilt alle eigenen Truppen
    ''' </summary>
    ''' <param name="Heilen"></param>
    ''' <remarks></remarks>
    Public Sub EigeneEinheitenHeilen(ByVal Heilen As Integer, Optional ByVal MitKosten As Boolean = False)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If MitKosten Then
                                    Schaden(X, Y, -Heilen, I)
                                Else
                                    Schaden(X, Y, -Heilen, I)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Raubt einen Teil der Gabeleiste
    ''' </summary>
    ''' <param name="Geld"></param>
    ''' <remarks></remarks>
    Public Sub Gabenraub(ByVal Geld As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                For I2 = 0 To Objektverwalter.Spielfeld.Spieler(I).KOS.Length - 1
                    If IsNothing(Objektverwalter.Spielfeld.Spieler(I).KOS(I2)) = False Then
                        Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist -= Objektverwalter.Spielfeld.AktuellerSpieler.Fonds / Geld * Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Sternkosten
                        If Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist < 0 Then
                            Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist = 0
                        End If
                    End If
                Next
            End If
        Next
    End Sub
    ''' <summary>
    ''' Fuegt einer Einheit Schaden zu
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <remarks></remarks>
    Public Shared Sub Schaden(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Hidden Then
            Dim NeuesLeben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
            NeuesLeben *= 10
            If NeuesLeben > 100 Then
                NeuesLeben = 100
            ElseIf NeuesLeben <= 0 Then
                NeuesLeben = 1
            End If
            Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Leben = NeuesLeben
        End If
    End Sub
    ''' <summary>
    ''' Startet eine Rakete auf ein Ziel
    ''' </summary>
    ''' <param name="Schaden"></param>
    ''' <param name="Animation"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Effekt"></param>
    ''' <param name="AnimationBuffer"></param>
    ''' <remarks></remarks>
    Public Sub Rakete(ByVal Schaden As Integer, ByVal Animation As String, ByVal Radius As Integer, ByVal Effekt As Effekte, Optional ByVal AnimationBuffer As Integer = 0, Optional ByVal TargetMode As Integer = 0)
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            Dim Punkt As Point = New Point(0, 0)
            Dim Geld As Integer = 0
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    Dim Geld2 As Integer = 0
                    Select Case TargetMode
                        Case 0
                            Geld2 = GetSchadeninGeld(X, Y, Schaden, Radius)
                        Case 1
                            Geld2 = GetMostTroops(X, Y, Schaden, Radius)
                        Case 2
                            Geld2 = GetMostHP(X, Y, Schaden, Radius)
                        Case Else
                            Geld2 = GetSchadeninGeld(X, Y, Schaden, Radius)
                    End Select
                    If Geld < Geld2 Then
                        Geld = Geld2
                        Punkt = New Point(X, Y)
                    ElseIf Geld = Geld2 And Zufallszahl(0, 2) = 0 Then 'Damit Raketen gestreut landen
                        Geld = Geld2
                        Punkt = New Point(X, Y)
                    End If
                Next
            Next
            Select Case Animation.ToUpper
                Case "METEOR"
                    Objektverwalter.NeuObjektAnimation(Punkt, Animation, True, ObjektSpielfeld.Bodenschlacht)
                Case Else
                    ObjektLadeklasse.SiloExplosion(Radius, Animation, Punkt.X, Punkt.Y, ObjektSpielfeld.Bodenschlacht)
            End Select
            Objektverwalter.ZuFeldgehen(Punkt.X, Punkt.Y)
            Silo(Punkt.X, Punkt.Y, Schaden, Radius, Effekt)
            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As New KINetzwerkBefehl
                Befehl.Befehl = ObjektKI.KIModiExtern.LaunchRocket
                Befehl.KooX = Punkt.X
                Befehl.KooY = Punkt.Y
                Befehl.OpferX = [Enum].Parse(RocketAnimations.LAND.GetType, Animation.ToUpper)
                Befehl.OpferY = Radius
                Befehl.AngreiferSchaden = Effekt
                Befehl.Verteidigerschaden = Schaden
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenue.NetzBefehlSenden(Befehl, True)
            End If
        End If
    End Sub
    Public Shared Sub Rakete(ByVal Punkt As Point, ByVal Animation As String, ByVal Schaden As Integer, ByVal Effekt As ObjektKO.Effekte)
        Select Case Animation.ToUpper
            Case "METEOR"
                Objektverwalter.NeuObjektAnimation(Punkt, Animation, True, ObjektSpielfeld.Bodenschlacht)
            Case Else
                ObjektLadeklasse.SiloExplosion(Radius, Animation, Punkt.X, Punkt.Y, ObjektSpielfeld.Bodenschlacht)
        End Select
        Objektverwalter.ZuFeldgehen(Punkt.X, Punkt.Y)
        Silo(Punkt.X, Punkt.Y, Schaden, Radius, Effekt)
    End Sub
    ''' <summary>
    ''' Gibt zurueck wie viel Schaden an dieser Stelle durch eine Rakete verursacht wuerde
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <param name="Radius"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetSchadeninGeld(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Radius As Integer) As Integer
        Dim Geld As Integer = 0
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Objektverwalter.Spielfeld.OnMap(X - Radius + X1, Y - Radius + Y1) Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            Dim VerlorenesLeben As Integer = Schaden
                            If VerlorenesLeben - Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP > 0 Then
                                If Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP > 1 Then
                                    VerlorenesLeben = Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP
                                Else
                                    VerlorenesLeben = 0
                                End If
                            End If
                            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Geld -= Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Kosten * VerlorenesLeben / 10 * 3
                            Else
                                Geld += Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Kosten * VerlorenesLeben / 10
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Return Geld
    End Function
    ''' <summary>
    ''' Gibt zurueck wie viel Einheiten an dieser Stelle durch eine Rakete getroffen wuerde
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <param name="Radius"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetMostTroops(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Radius As Integer) As Integer
        Dim Geld As Integer = 0
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Objektverwalter.Spielfeld.OnMap(X - Radius + X1, Y - Radius + Y1) Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).GetSpieler.Team <> Me.GetSpieler.Team Then
                                Geld += 1
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Return Geld
    End Function
    ''' <summary>
    ''' Gibt zurueck wie viel HP an dieser Stelle durch eine Rakete verursacht wuerde
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <param name="Radius"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetMostHP(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Radius As Integer) As Integer
        Dim Geld As Integer = 0
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Objektverwalter.Spielfeld.OnMap(X - Radius + X1, Y - Radius + Y1) Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).GetSpieler.Team <> Me.GetSpieler.Team Then
                                Geld += Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Return Geld
    End Function
    ''' <summary>
    ''' Richtet den Schaden einer Rakete an.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="neuSchaden"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Effekt"></param>
    ''' <remarks></remarks>
    Public Shared Sub Silo(ByVal X As Integer, ByVal Y As Integer, ByVal neuSchaden As Integer, ByVal Radius As Integer, ByVal Effekt As Effekte)
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Objektverwalter.Spielfeld.OnMap(X - Radius + X1, Y - Radius + Y1) Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            Schaden(X - Radius + X1, Y - Radius + Y1, neuSchaden, ObjektSpielfeld.Bodenschlacht)
                            Select Case Effekt
                                Case Effekte.Keiner
                                Case Effekte.Schock
                                    Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).HatsichBewegt = True
                                Case Effekte.Nuklearverseuchung
                                    Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).IncreaseRadioaktiveVerseuchung(neuSchaden)
                            End Select
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Laesst alle Truppen ausser INF noch mal ziehen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub NochmalZiehen()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Fuss.ToString And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Mech.ToString Then
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = False
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Einheiten auf Staedten erleiden X  Schaden
    ''' Fuehrt ausserdem eine Animation aus.
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Stadtschaden(ByVal neuSchaden As Integer)
        Dim WZeit As Integer = 2
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    Schaden(X, Y, neuSchaden, I)
                                    BackbufferSpiel.AddAnimation("DRAKEGABE", WZeit, New Point(X, Y), True, I)
                                    WZeit += 4
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Schockt alle Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Schock()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = True
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Truppen erhalten Ration
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub VollRation()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                Objektverwalter.Ration(X, Y, False, 0, I)
                                'So waere es richtig glaube ich!
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).HasMaterial Then
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition = Objektverwalter.Spielfeld.Einheiten(X, Y, I).MunitionMax
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Ermoeglicht den Bau von Truppen auf Staedten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Stadtbauen()
        Dim Bauliste() As String = ObjektLadeklasse.GetBauliste("BASIS")
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GebaeudeID = "STADT" Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler Then
                                Dim G As GebaeudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                                G.KannBauen = True
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Erstellt Einheiten mit Leben auf jeder eigenen Stadt
    ''' </summary>
    ''' <param name="EinheitID"></param>
    ''' <param name="Leben"></param>
    ''' <remarks></remarks>
    Public Sub Fallschrimspringer(ByVal EinheitID As String, ByVal Leben As Integer, ByVal Animation As String, ByVal GebaeudeID As String)
        Dim WZeit As Integer = 2
        Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(EinheitID, Spieler, 0, 0, Leben)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If (Objektverwalter.Spielfeld.Regeln.MaxTroops > 0 And GetSpieler.CountUnits() < Objektverwalter.Spielfeld.Regeln.MaxTroops) Or Objektverwalter.Spielfeld.Regeln.MaxTroops <= 0 Then
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude) = False Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude.GebaeudeID = GebaeudeID Then
                                If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude.Spieler Then
                                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) Then
                                        If Objektverwalter.Bewegungskosten(E, GebaeudeID, Objektverwalter.Spielfeld.Regeln.Wetter, X, Y) >= 0 Then
                                            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, ObjektSpielfeld.Bodenschlacht)
                                            WZeit += 4
                                            Objektverwalter.ZuFeldgehen(X, Y)
                                            Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht) = ObjektLadeklasse.NewEinheit(EinheitID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, X, Y, Leben, False)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Veraendert das Wetter fuer X Runden
    ''' </summary>
    ''' <param name="neuesWetter"></param>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub WetterAendern(ByVal neuesWetter As ObjektSpielfeld.Wetterarten, ByVal Dauer As Integer)
        Objektverwalter.Spielfeld.Regeln.WetterAendern(neuesWetter, Dauer)
    End Sub
    ''' <summary>
    ''' Klaut alle Feinden die haelfte ihrer Munition und Treibstoffvorraete
    ''' </summary>
    ''' <param name="Munition"></param>
    ''' <param name="Treibstoff"></param>
    ''' <remarks></remarks>
    Public Sub MuniTreibrauben(ByVal Munition As Boolean, ByVal Treibstoff As Boolean)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                If Munition = True Then
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition = -Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition / 2
                                End If
                                If Treibstoff = True Then
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).Treibstoff = -Objektverwalter.Spielfeld.Einheiten(X, Y, I).Treibstoff / 2
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Feinde erhalten kein Einkommen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Keineinkommen()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.KeineEinnahmen = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Wir erhalten fuer jedes feindliche Gebaeude die haelfte der Fonds
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub GeldfuerFeindlicheStaedte()
        Dim Geld As Integer
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Geld += Objektverwalter.Spielfeld.Spieler(I).GetGebaeude(ObjektSpieler.Gebaeudesuche.Fonds) * Objektverwalter.Spielfeld.Spieler(I).FondsproStadt / 2
            End If
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Geld)
    End Sub
    ''' <summary>
    ''' Heilt eigene Einheiten und laesst den Gegner dafuer Zahlen
    ''' </summary>
    ''' <param name="Heilung"></param>
    ''' <param name="KampfverstaerkungfuermehrHeilung"></param>
    ''' <remarks></remarks>
    Public Sub Geldheilung(ByVal Heilung As Integer, ByVal KampfverstaerkungfuermehrHeilung As Integer)
        Dim Kosten As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                Dim Leben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, I).getKP
                                Dim KP As Integer = Heilung
                                If KP + Leben > 10 Then
                                    KP = 10 - Leben
                                    Leben = 10
                                End If
                                'Wenn wir zuviel geheilt haben kaempfen wir besser.
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).ATKDEFBoost.X += KampfverstaerkungfuermehrHeilung * (Heilung - KP)
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = Leben * 10
                                Kosten += Objektverwalter.Spielfeld.Einheiten(X, Y, I).Kosten / 10 * KP
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        Kosten /= Feinde.Length
        For I = 0 To Feinde.Length - 1
            Objektverwalter.Spielfeld.Spieler(Feinde(I)).AddFonds(-Kosten)
        Next
    End Sub
    ''' <summary>
    ''' Wir erhalten die haelfte alle Fonds unserer Gegner
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GetHalfMoney()
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        For I = 0 To Feinde.Length - 1
            Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Objektverwalter.Spielfeld.Spieler(Feinde(I)).Fonds / 2)
            Objektverwalter.Spielfeld.Spieler(Feinde(I)).AddFonds(-Objektverwalter.Spielfeld.Spieler(Feinde(I)).Fonds / 2)
        Next
    End Sub
    ''' <summary>
    ''' Alle nicht Flugzeuge auf natuerlichem Terrain erleiden Schaden
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Bombenregen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude) = True Then
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    If Not Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Bewegungsart = MovementSorts.Flugzeug.ToString And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.ToString Then
                                        Schaden(X, Y, neuSchaden, ObjektSpielfeld.Bodenschlacht)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle eigenen Einheiten auf nicht Gebaeuden werden geheilt
    ''' </summary>
    ''' <param name="Heilrate"></param>
    ''' <remarks></remarks>
    Public Sub NaturHeilung(ByVal Heilrate As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = True Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                    Schaden(X, Y, -Heilrate, I)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle feindlichen Einheiten auf nicht Gebaeuden erleiden Schaden
    ''' </summary>
    ''' <param name="Damage"></param>
    ''' <remarks></remarks>
    Public Sub NaturGift(ByVal Damage As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = True Then
                                'UV
                                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                    Schaden(X, Y, Damage, I)
                                End If

                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Staedte verlieren einen Teil ihre Besetzungszahl fuer eine Runde und wir erhalten einen Teil des Geldes
    ''' </summary>
    ''' <param name="BesetzungsZahl"></param>
    ''' <remarks></remarks>
    Public Sub Besetzungsniedergang(ByVal BesetzungsZahl As Integer)
        Dim Fonds As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung > 0 Then
                                    Dim B As Integer = BesetzungsZahl
                                    If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung - B <= 0 Then
                                        B = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung - 1
                                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung = 1
                                    Else
                                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung - B
                                    End If
                                    Fonds += B / 20 * Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler).FondsproStadt
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Fonds)
    End Sub
    ''' <summary>
    ''' Dadurch kann kein feindlicher Spieler seine Gabe auffuellen bis zu seinem Zug ende.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinGabeleisteAuffuellung()
        For Each MitSpieler In Objektverwalter.Spielfeld.Spieler
            If MitSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                MitSpieler.VeraenderteWerte.KeinGabeFortschritt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' So uebernimmt der Spieler eine zufaellige Stadt.
    ''' </summary>
    ''' <param name="Zahl"></param>
    ''' <remarks></remarks>
    Public Sub StadtUebernehmen(ByVal Zahl As Integer)
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            'Wir suchen erst mal alle Staedte
            Dim Gebaeude As GebaeudeStadt() = {}
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Hidden Then
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude Is Nothing Then
                            If TypeOf Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude Is GebaeudeStadt Then
                                Dim Stadt As GebaeudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                                If Stadt.Spieler = 0 Then
                                    Array.Resize(Gebaeude, Gebaeude.Length + 1)
                                    Gebaeude(Gebaeude.Length - 1) = Stadt
                                ElseIf Objektverwalter.Spielfeld.Spieler(Stadt.Spieler).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                    Array.Resize(Gebaeude, Gebaeude.Length + 1)
                                    Gebaeude(Gebaeude.Length - 1) = Stadt
                                End If
                            End If
                        End If
                    End If
                Next
            Next
            If Gebaeude.Length > 0 Then
                Dim Max As Integer = Zahl
                If Max > Gebaeude.Length Then
                    Max = Gebaeude.Length
                End If
                For I = 1 To Zahl
                    Dim Stadt As Integer
                    'wir suchen eine Stadt heraus die wir uebernehemen koennen
                    Dim Zaehler As Integer = 0
                    Do
                        Stadt = Zufallszahl(0, Gebaeude.Length - 1)
                        Zaehler += 1
                    Loop Until Gebaeude(Stadt).GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team And Zaehler < 999999
                    GebaeudeUebernehmen(Gebaeude(Stadt).Rechteck.X, Gebaeude(Stadt).Rechteck.Y)
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                        Dim Befehl As New KINetzwerkBefehl
                        Befehl.Befehl = ObjektKI.KIModiExtern.ShockUnit
                        Befehl.KooX = Gebaeude(Stadt).Rechteck.X
                        Befehl.KooY = Gebaeude(Stadt).Rechteck.Y
                        Befehl.OpferX = -1
                        Befehl.OpferY = -1
                        Befehl.AngreiferSchaden = -1
                        Befehl.Verteidigerschaden = -1
                        Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                        Hauptmenue.NetzBefehlSenden(Befehl, True)
                    End If
                Next
            End If
        End If
    End Sub
    Public Sub GebaeudeUebernehmen(ByVal X As Integer, ByVal Y As Integer)
        Dim Gebaeude As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
        If Gebaeude IsNot Nothing Then
            Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
            'Das Gebaeude wird nicht mehr besetzt
            If Not Objektverwalter.Spielfeld.Einheiten(Gebaeude.Rechteck.X, Gebaeude.Rechteck.Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                Objektverwalter.Spielfeld.Einheiten(Gebaeude.Rechteck.X, Gebaeude.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Besetzen = False
            End If
            'Jetzt uebernehmen wir die Stadt=)
            Gebaeude.Spieler = Spieler
            Gebaeude.getBildID(Objektverwalter.Spielfeld)
        End If
    End Sub
    ''' <summary>
    ''' Dadurch muessen alle Feinde ihre Besetzen von vorne Anfangen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RestartBesetzungen()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I) Is Nothing Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = True Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = False
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Beschaedigt alle Feinde und wenn sie weniger TP haben als unten gesagt koennen sie sich nicht mehr bewegen
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Laehmungsschaden(ByVal neuSchaden As Integer, ByVal RestTP As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Schaden(X, Y, neuSchaden, I)

                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).getKP <= RestTP Then
                                    Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = True
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Eine zufaellige Einheit erhaelt mehr Atk und einen Bewegungspunkt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub IncreaseAnyUnitATKandMovementPointsNachZerstoerung(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then

            Dim AlleTruppen As ObjektEinheit() = {}
            For Each Einheit In Objektverwalter.Spielfeld.Einheiten
                If IsNothing(Einheit) = False Then
                    If Einheit.Spieler = Spieler Then
                        If Einheit.HatsichBewegt = False Then
                            If Einheit.X <> Objektverwalter.Spielfeld.AktuelleEinheit.X And Einheit.Y <> Objektverwalter.Spielfeld.AktuelleEinheit.Y Then
                                Array.Resize(AlleTruppen, AlleTruppen.Length + 1)
                                AlleTruppen(AlleTruppen.Length - 1) = Einheit
                            End If
                        End If
                    End If
                End If
            Next
            If AlleTruppen.Length > 0 Then
                Dim Einheit As ObjektEinheit = AlleTruppen(Zufallszahl(0, AlleTruppen.Length - 1))
                Einheit.Bewegungsbonus += AnyUnitKampfverstaerker.Y * GetKOZoneBoost(X, Y)
                Einheit.ATKDEFBoost.X += AnyUnitKampfverstaerker.X * GetKOZoneBoost(X, Y)
                Hauptmenue.NetzBefehlSendenEinheitVerbessern(Einheit.X, Einheit.Y, Einheit.GetMap, AnyUnitKampfverstaerker.X * GetKOZoneBoost(X, Y), AnyUnitKampfverstaerker.Y * GetKOZoneBoost(X, Y))
            End If
        End If
    End Sub
    ''' <summary>
    ''' Legt fest welches Glueck und Pech unsere Gegner haben
    ''' </summary>
    ''' <param name="Glueck"></param>
    ''' <param name="Pech"></param>
    ''' <remarks></remarks>
    Public Sub SetEnemyLuckandCurse(ByVal Glueck As Integer, ByVal Pech As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.Gluecksaenderung = New Point(Glueck, Pech)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Legt fest wie weit Gegner im Kriegsnebel sehen koennen.
    ''' </summary>
    ''' <param name="Sichtweite"></param>
    ''' <remarks></remarks>
    Public Sub SetEnemyVisionRange(ByVal Sichtweite As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.SichtradiusVeraenderung = Sichtweite
            End If
        Next
    End Sub
    ''' <summary>
    ''' Aktiviert den Kriegsnebel fuer X Tage
    ''' </summary>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub ActivateKriegsnebel(ByVal Dauer As Integer)
        Dim Nebel As Nebelarten = Nebelarten.Aus
        For Each NeuSpieler In Objektverwalter.Spielfeld.Spieler
            If NeuSpieler.KOS(0).KriegsnebelErstellung.X > 0 Then
                Nebel = NeuSpieler.KOS(0).KriegsnebelErstellung.X
                Exit For
            ElseIf Not NeuSpieler.KOS(1) Is Nothing Then
                If NeuSpieler.KOS(1).KriegsnebelErstellung.X > 0 Then
                    Nebel = NeuSpieler.KOS(0).KriegsnebelErstellung.X
                    Exit For
                End If
            End If
        Next
        KriegsnebelErstellung = New Point(Nebel, Dauer)
        Objektverwalter.Spielfeld.Regeln.Nebel = Nebelarten.Kriegsnebel
    End Sub
    ''' <summary>
    ''' Sorgt dafuer das Gegner keine Gabe einsetzen koennen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinGabeEinsatz()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.Gabeeinsatz = False
            End If
        Next
    End Sub
    ''' <summary>
    ''' Sorgt dafuer das Gegner nur mit Infanteristen angreifen koennen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinAngriffAusserInfanterie()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.KeinAngriffausserINF = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Alle TP der Gegner werden abgerundet
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Lebensabrundung()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = Math.DivRem(CInt(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben), 10, 0) * 10
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben <= 0 Then Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = 1
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Gegner sehen feindliche TP nicht mehr.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinTPSehungFeinde()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.FeindlicheTPVersteckt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner sehen eigene TP nicht mehr.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinTPSehungEigene()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.EigeneTPVersteckt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner bekommen keine Ration für eine Runde.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeineVersorgung(ByVal Dauer As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.KeineVersorgung = New Point(1, Dauer)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Jeder Spieler bekommt weniger Geld fuer Besetzungen die von feinden Besetzt werden.
    ''' </summary>
    ''' <param name="Wert"></param>
    ''' <remarks></remarks>
    Public Sub WenigerEinahmendurchBesetzungszahl(ByVal Wert As Single)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.GeldproBesetzungszahl += Wert
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner koennen keine Truppen bauen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeineTruppenBau()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.KeinBau = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner haben immer nur noch so viel Deckung
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AndereDeckung(ByVal Veraenderung As Single)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.TerrainVeraender = Veraenderung
            End If
        Next
    End Sub
    ''' <summary>
    ''' Setzt die BEwegungspunkte fuer dieses Feld fest
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub BewegungspunkteFestlegen(ByVal X As Integer, ByVal Y As Integer)
        If BewegungsKostenAenderungNachZerstoerung.Y = 1 Then
            Objektverwalter.Spielfeld.Spieler(Spieler).VeraenderteWerte.VeraenderteBewegungsFelder.Push(New Vector3(X, Y, BewegungsKostenAenderungNachZerstoerung.X * GetKOZoneBoost(X, Y)))
        ElseIf BewegungsKostenAenderungNachZerstoerung.Y = 2 Then
            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                    Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.VeraenderteBewegungsFelder.Push(New Vector3(X, Y, BewegungsKostenAenderungNachZerstoerung.X * GetKOZoneBoost(X, Y)))
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Wir erhalten die Haelfte aller feindlichen Einkuenfte
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GetHalfIncome()
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        For Each Feind In Feinde
            Objektverwalter.Spielfeld.Spieler(Spieler).AddFonds((Objektverwalter.Spielfeld.Spieler(Feind).FondsproStadt * Objektverwalter.Spielfeld.Spieler(Feind).GetGebaeude(ObjektSpieler.Gebaeudesuche.Fonds)) / 2)
            Objektverwalter.Spielfeld.Spieler(Feind).VeraenderteWerte.Einkommensveraenderung = 0.5
        Next
    End Sub
    ''' <summary>
    ''' Gibt alle Einheiten dieses Spielers zurueck
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetUnits() As ObjektEinheit()
        Dim Truppen As ObjektEinheit() = {}
        For Each Unit In Objektverwalter.Spielfeld.Einheiten
            If Not Unit Is Nothing Then
                If Unit.Spieler = Spieler Then
                    Array.Resize(Truppen, Truppen.Length + 1)
                    Truppen(Truppen.Length - 1) = Unit
                End If
            End If
        Next
        Return Truppen
    End Function
    ''' <summary>
    ''' Gegner haben erhoehte Bewegungskosten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub HoehereBewegungskosten(ByVal Veraenderung As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeraenderteWerte.Bewegungskosten += Veraenderung
            End If
        Next
    End Sub
    ''' <summary>
    ''' Unser Gegner erhaelt pro eigener Einheit die ihn Angreifen kann Schaden
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Zusatzangriffe()
        Dim Units As ObjektEinheit() = GetUnits()
        For Each Gegner In Objektverwalter.Spielfeld.Einheiten
            Dim Schaden As Integer = 0
            If Not Gegner Is Nothing Then
                If Objektverwalter.Spielfeld.Spieler(Gegner.Spieler).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                    For Each Unit In Units
                        If Unit.IsInFirerange(Gegner) = True Then
                            If Unit.IsAttackable(Gegner, False) = True Then
                                Schaden += Unit.GetGroundDamage(Gegner, False) * Unit.getKP / 10
                            End If
                        End If
                    Next
                    Gegner.Leben -= Schaden
                    If Gegner.Leben <= 0 Then
                        Gegner.Leben = 1
                    End If
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' Entfernt ein Bonusgebaeude aus dem Array
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <remarks></remarks>
    Public Sub RemoveBonusGebaeude(ByVal Ort As Point)
        For I = 0 To BonusGebaeude.Length - 1
            If Ort.X = BonusGebaeude(I).X And Ort.Y = BonusGebaeude(I).Y Then
                RemoveBonusGebaeude(I)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Entfernt ein Bonusgebaeude aus dem Array
    ''' </summary>
    ''' <param name="Stelle"></param>
    ''' <remarks></remarks>
    Public Sub RemoveBonusGebaeude(ByVal Stelle As Integer)
        BonusGebaeude(Stelle) = BonusGebaeude(BonusGebaeude.Length - 1)
        Array.Resize(BonusGebaeude, BonusGebaeude.Length - 1)
    End Sub
    ''' <summary>
    ''' Fuegt eine Gebaeude dem Array hinzu.
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <remarks></remarks>
    Public Sub AddBonusgebaeude(ByVal Ort As Point, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer)
        For I = 0 To BonusGebaeude.Length - 1
            If BonusGebaeude(I).X = Ort.X And BonusGebaeude(I).Y = Ort.Y Then
                BonusGebaeude(I).Z += BesetzungsbonusNachEinheitenZerstoerung * GetKOZoneBoost(AngreiferX, AngreiferY)
                Exit Sub
            End If
        Next
        Array.Resize(BonusGebaeude, BonusGebaeude.Length + 1)
        BonusGebaeude(BonusGebaeude.Length - 1) = New Vector3(Ort.X, Ort.Y, BesetzungsbonusNachEinheitenZerstoerung * GetKOZoneBoost(AngreiferX, AngreiferY))
    End Sub
    ''' <summary>
    ''' Gibt das Bonusgebaeude zurueck -1 gleich keines Gefunden.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetBonusgebaeude(ByVal X As Integer, ByVal Y As Integer) As Integer
        For I = 0 To BonusGebaeude.Length - 1
            If BonusGebaeude(I).X = X And BonusGebaeude(I).Y = Y Then
                Return I
            End If
        Next
        Return -1
    End Function
    ''' <summary>
    ''' Laedt den KO so wie er vor dem Spechern war.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KONachSpielstandladenLaden()
        KOLaden()
        Select Case Gabemodus
            Case ObjektKO.Gabemodi.Gabe
                Gabeeinsetzen(True)
            Case ObjektKO.Gabemodi.Spezialgabe
                SpezialGabeeinsetzen(True)
            Case ObjektKO.Gabemodi.Doppelgabe
                SpezialGabeeinsetzen(True)
        End Select
    End Sub
    ''' <summary>
    ''' Plaziert eine Armee auf der Karte.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Invasion(ByVal InvasionsTruppen() As String)
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            Dim InvasionsStadt As ObjektGebaeude = Nothing
            Dim Entfernung As Integer = -1
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Hidden Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = "STADT" Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude.Spieler = Spieler Then
                                Dim E As New EinheitJagdpanzer(Spieler, X, Y, False)
                                Dim WSS As New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, -1)
                                Dim Ziel As Point = GetNaehestenFeindVonGebaeude(E, WSS)
                                Dim Entfernung2 As Integer = WSS.getBewegungspunktekosten(Ziel)
                                If Entfernung < 0 Then
                                    InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                                    Entfernung = Entfernung2
                                ElseIf Entfernung2 < Entfernung Then
                                    InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                                    Entfernung = Entfernung2
                                ElseIf Entfernung = Entfernung2 And Zufallszahl(0, 1) = 0 Then
                                    InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                                    Entfernung = Entfernung2
                                End If
                            End If
                        End If
                    End If
                Next
            Next
            If Not InvasionsStadt Is Nothing Then
                For I = 0 To InvasionsTruppen.Length - 1
                    If (Objektverwalter.Spielfeld.Regeln.MaxTroops > 0 And GetSpieler.CountUnits() < Objektverwalter.Spielfeld.Regeln.MaxTroops) Or Objektverwalter.Spielfeld.Regeln.MaxTroops <= 0 Then
                        Dim Einheit As ObjektEinheit = ObjektLadeklasse.NewEinheit(InvasionsTruppen(I), Spieler, -1, -1, False)
                        Objektverwalter.Spielfeld.PlaceUnit(Einheit, InvasionsStadt.Rechteck.X, InvasionsStadt.Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
                        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                            Dim Befehl As New KINetzwerkBefehl
                            Befehl.Befehl = ObjektKI.KIModiExtern.InvasionUnit
                            Befehl.KooX = InvasionsStadt.Rechteck.X
                            Befehl.KooY = InvasionsStadt.Rechteck.Y
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I).EinheitenID = Einheit.EinheitenID Then
                                    Befehl.OpferX = I2
                                    Exit For
                                End If
                            Next
                            Befehl.OpferY = -1
                            Befehl.AngreiferSchaden = -1
                            Befehl.Verteidigerschaden = -1
                            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                            Hauptmenue.NetzBefehlSenden(Befehl, True)
                        End If
                    End If
                Next
            End If
        End If
    End Sub
    Public Sub Invasion(ByVal Unit As String, ByVal X As Integer, ByVal Y As Integer)
        Dim Einheit As ObjektEinheit = ObjektLadeklasse.NewEinheit(Unit, Spieler, -1, -1, False)
        Objektverwalter.Spielfeld.PlaceUnit(Einheit, X, Y, ObjektSpielfeld.Bodenschlacht)
    End Sub
    ''' <summary>
    ''' Gibt zurueck welche Landschaft diese Landschaft fuer den KO ist. Wegkosten.
    ''' Olaf Schnee zu Ebene.
    ''' </summary>
    ''' <param name="LandschaftsID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetLandschaft(ByVal LandschaftsID As String) As String
        If LandschaftsVertauschung.Length > 0 Then
            For I = 0 To LandschaftsVertauschung.GetLength(0) - 1
                If LandschaftsVertauschung(I, 0) = LandschaftsID Then
                    Return LandschaftsVertauschung(I, 1)
                End If
            Next
            Return LandschaftsID
        Else
            Return LandschaftsID
        End If
    End Function
    ''' <summary>
    ''' Macht Besetzungen Neutral ausser HQS
    ''' </summary>
    ''' <param name="Besetzungszahl"></param>
    ''' <remarks></remarks>
    Public Sub NeutraleBesetzungMachen(ByVal Besetzungszahl As Integer)
        Dim Schlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        If Not G Is Nothing Then
                            If G.Besetzung > 0 Then
                                If G.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                    If G.Besetzung <= Besetzungszahl Then
                                        If G.Angriff <> ObjektGebaeude.Angriffe.HQ Then
                                            'Diese Besetzung wird neutral
                                            G.Spieler = 0
                                            G.getBildID(Nothing)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Laesst Geld pro neutralem Gebaeude verdienen.
    ''' </summary>
    ''' <param name="GeldProGebaeude"></param>
    ''' <remarks></remarks>
    Public Sub GetNeutralesGeld(ByVal GeldProGebaeude As Integer)
        Dim NeutraleGebaeude As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        If Not G Is Nothing Then
                            If G.Spieler = 0 Then
                                If G.getFonds = True Then
                                    NeutraleGebaeude += GeldProGebaeude
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.Spieler(Spieler).AddFonds(NeutraleGebaeude)
    End Sub
    ''' <summary>
    ''' Schockt den prozentualen Teil aller Feinde
    ''' </summary>
    ''' <param name="ProzentualerTeil"></param>
    ''' <remarks></remarks>
    Public Sub SchockEnemys(ByVal ProzentualerTeil As Integer)
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            If ProzentualerTeil <= 0 Then Exit Sub
            If ProzentualerTeil > 100 Then ProzentualerTeil = 100
            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                    Dim Units As ObjektEinheit() = Objektverwalter.Spielfeld.Spieler(I).KOS(0).GetUnits
                    Dim SchockZahl As Integer = Units.Length * (ProzentualerTeil / 100)
                    For I2 = 1 To SchockZahl
                        Dim Unit As Integer = Zufallszahl(0, Units.Length - I2)
                        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                            Dim Befehl As New KINetzwerkBefehl
                            Befehl.Befehl = ObjektKI.KIModiExtern.ShockUnit
                            Befehl.KooX = Units(Unit).X
                            Befehl.KooY = Units(Unit).Y
                            Befehl.OpferX = -1
                            Befehl.OpferY = -1
                            Befehl.AngreiferSchaden = -1
                            Befehl.Verteidigerschaden = -1
                            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                            Hauptmenue.NetzBefehlSenden(Befehl, True)
                        End If
                        Units(Unit).HatsichBewegt = True
                        Units(Unit) = Units(Units.Length - I2)
                    Next
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Sorgt dafuer das Nahkampfeinheiten sich untereinander bekriegen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub EnemyBattle()
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            Dim Schlacht As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
            Dim Units As New List(Of ObjektEinheit)
            For I = 0 To Schlacht
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                            If Not E Is Nothing Then
                                If E.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                    Units.Add(E)
                                End If
                            End If
                        End If
                    Next
                Next
            Next
            Dim I2 As Integer = 0
            While Units.Count > 0
                I2 = Zufallszahl(0, Units.Count - 1)
                Dim E As ObjektEinheit = Units(I2)
                If E.MinimaleReichweite = 1 Then
                    'ein Nahkaempfer
                    'es ist ein Feind
                    If E.HatsichBewegt = False Then
                        Dim Opfer() As ObjektEinheit = GetAttackableUnits(E)
                        Dim RealVictims As New List(Of ObjektEinheit)
                        For Each O In Opfer
                            If O.GetDistance(E) = 1 Then
                                RealVictims.Add(O)
                            End If
                        Next
                        If RealVictims.Count > 0 Then
                            Dim Enemy As ObjektEinheit = RealVictims(Zufallszahl(0, Opfer.Length - 1))
                            Objektverwalter.Angriff(E, Enemy.X, Enemy.Y, True)
                        End If
                    End If
                Else
                    'ein Fernkaempfer

                    'es ist ein Feind
                    If E.HatsichBewegt = False Then
                        Dim Opfer() As ObjektEinheit = GetAttackableFernkampfUnits(E)
                        Dim RealVictims As New List(Of ObjektEinheit)
                        For Each O In Opfer
                            Dim D As Integer = O.GetDistance(E)
                            If D >= E.MinimaleReichweite And D <= E.MaximaleReichweite Then
                                RealVictims.Add(O)
                            End If
                        Next
                        If RealVictims.Count > 0 Then
                            Dim Enemy As ObjektEinheit = RealVictims(Zufallszahl(0, Opfer.Length - 1))
                            Objektverwalter.Angriff(E, Enemy.X, Enemy.Y, True)
                        End If
                    End If
                End If
                Units.RemoveAt(I2)
            End While
        End If
    End Sub
    ''' <summary>
    ''' Gibt die Felder zurueck die von diesem Feld aus angegriffen werden koennen
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <remarks></remarks>
    Public Function GetAttackableUnits(ByVal Einheit As ObjektEinheit, Optional ByVal PosX As Integer = -1, Optional ByVal PosY As Integer = -1) As ObjektEinheit()
        Dim Units As ObjektEinheit() = {}
        If PosX < 0 Or PosY < 0 Then
            PosX = Einheit.X
            PosY = Einheit.Y
        End If
        Dim X2 As Integer = PosX
        Dim Y2 As Integer = PosY
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Objektverwalter.Spielfeld.OnMap(X2, Y2) Then
                Dim P2 As New Point(X2, Y2)
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(P2.X, P2.Y, Einheit.GetMap)
                If Not E Is Nothing Then
                    If Einheit.IsAttackable(E, True) = True Then
                        Array.Resize(Units, Units.Length + 1)
                        Units(Units.Length - 1) = E
                    End If
                End If
            End If
        Next
        Return Units
    End Function
    ''' <summary>
    ''' Fernkaempfer greifen nur feinde an nicht unsere.
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetAttackableFernkampfUnits(ByVal Unit As ObjektEinheit) As ObjektEinheit()
        Dim Units As ObjektEinheit() = {}
        Dim Felder As Point() = {}
        If Unit.MaximaleReichweite > 1 Then
            Dim MaximaleReichweite As Integer = Unit.MaximaleReichweite
            Dim MinimaleReichweite As Integer = Unit.MinimaleReichweite
            If MaximaleReichweite > 1 Then
                Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)
                For X1 = 0 To MaximaleReichweite * 2
                    For Y1 = 0 To MaximaleReichweite * 2
                        If Kreis(X1, Y1) >= MinimaleReichweite Then
                            Dim neuerPunkt As Point = New Point(Unit.X - MaximaleReichweite + X1, Unit.Y - MaximaleReichweite + Y1)
                            If Objektverwalter.Spielfeld.OnMap(neuerPunkt.X, neuerPunkt.Y) Then
                                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(neuerPunkt.X, neuerPunkt.Y, Unit.GetMap)
                                If Not E Is Nothing Then
                                    If E.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                        If Unit.IsAttackable(E, True) Then
                                            Array.Resize(Units, Units.Length + 1)
                                            Units(Units.Length - 1) = Unit
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    Next
                Next
            End If
        End If
        Return Units
    End Function
    ''' <summary>
    ''' Erstellt ein Gebaeude in der naehe einer Stadt. Hinweis es duerfen nur kleine Gebaeude sein.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CreateGebaeude(ByVal GebaeudeID As String)
        If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
            Dim Staedte As GebaeudeStadt() = {}
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Hidden Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = "STADT" Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude.Spieler = Spieler Then
                                Array.Resize(Staedte, Staedte.Length + 1)
                                Staedte(Staedte.Length - 1) = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                            End If
                        End If
                    End If
                Next
            Next
            If Staedte.Length > 0 Then
                Dim InvasionsStadt As ObjektGebaeude = Staedte(Zufallszahl(0, Staedte.Length - 1))
                If Not InvasionsStadt Is Nothing Then
                    Dim G As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(GebaeudeID, Spieler, -1, -1, False)
                    Objektverwalter.Spielfeld.PlaceBuilding(G, InvasionsStadt.Rechteck.X, InvasionsStadt.Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                        Dim Befehl As New KINetzwerkBefehl
                        Befehl.Befehl = ObjektKI.KIModiExtern.PlaceBuilding
                        Befehl.KooX = InvasionsStadt.Rechteck.X
                        Befehl.KooY = InvasionsStadt.Rechteck.Y
                        Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebaeudeZahlID(GebaeudeID)
                        Befehl.Verteidigerschaden = -1
                        Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                        Hauptmenue.NetzBefehlSenden(Befehl, True)
                    End If
                End If
            End If
        End If
    End Sub
    Public Sub HealBuildings(ByVal Leben As Integer)
        Dim Schlacht As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        If Not G Is Nothing Then
                            If G.Spieler = Spieler Then
                                If G.KP > 0 Then
                                    If G.GetRealGebaeudeID <> "VERWEIS" Then
                                        G.KP = Leben + G.KP
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Public Sub GebaeudeNochmalSchiessen()
        Dim Schlacht As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        If Not G Is Nothing Then
                            If G.Spieler = Spieler Then
                                If G.GetRealGebaeudeID <> "VERWEIS" Then
                                    If G.Feuerbereit > 0 Then
                                        G.SetFeuerbereit(0)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Gibt das Feld zurueck auf das wir ziehen sollten um moeglichst bald angreifen zu koennen. Mit einer Nahkampfeinheit
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <param name="WSS"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetNaehestenFeindVonGebaeude(ByVal Einheit As ObjektEinheit, Optional ByRef WSS As Wegsuchsystem = Nothing) As Point
        Dim Ziel As New Point(-1, -1)
        Dim MomentaneWegkosten As Integer = -1
        If Einheit.MinimaleReichweite = 1 Then
            If WSS Is Nothing Then
                WSS = New Wegsuchsystem(Einheit, Einheit.X, Einheit.Y, Einheit.GetMap, -1)
            End If
            Dim BewMax As Integer = Einheit.GetMovementRange
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    Dim Bew As Integer = WSS.getBewegungspunktekosten(X, Y)
                    If Bew >= 0 Then
                        If ObjektKI.IsFeldLeer(X, Y, Einheit) Then
                            'Wir koennen das Feld erreichen
                            If KannNahkampfvonFeldgemachtwerden(Einheit, X, Y) = True Then
                                If Bew < MomentaneWegkosten And Bew > BewMax Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                ElseIf Bew = MomentaneWegkosten And Zufallszahl(0, 1) = 1 Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                ElseIf MomentaneWegkosten = -1 Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
        Return Ziel
    End Function
    ''' <summary>
    ''' Ueberprueft ob von diesem Feld per Nahangriff eine Einheit angegriffen werden kann
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function KannNahkampfvonFeldgemachtwerden(ByVal Einheit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer) As Boolean
        If Not Einheit.Waffe1 = "Keine" Or Einheit.MinimaleReichweite = 1 Then
            Dim X2 As Integer = X
            Dim Y2 As Integer = Y
            For I = 0 To 3
                Select Case I
                    Case 0
                        X2 -= 1
                    Case 1
                        X2 += 1
                        Y2 -= 1
                    Case 2
                        X2 += 1
                        Y2 += 1
                    Case 3
                        X2 -= 1
                        Y2 += 1
                End Select
                If Objektverwalter.Spielfeld.OnMap(X2, Y2) Then
                    If Einheit.IsAttackable(Objektverwalter.Spielfeld.Einheiten(X2, Y2, ObjektSpielfeld.Bodenschlacht), True) = True Then
                        Return True
                    End If
                End If
            Next
        End If
        Return False
    End Function
    ''' <summary>
    ''' Earns some Money depending on the current Money.
    ''' </summary>
    ''' <param name="Earning"></param>
    ''' <remarks></remarks>
    Public Sub EarnMoney(ByVal Earning As Integer)
        Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Objektverwalter.Spielfeld.AktuellerSpieler.Fonds * Earning / 100)
    End Sub

    Public Enum UnitDamageModeWave
        Stack_All
        No_Stack_All
        CO_Zone
    End Enum
    ''' <summary>
    ''' A Damage Wave is send from all own Units and does Damage to Enemy one's.
    ''' </summary>
    ''' <param name="Damage"></param>
    ''' <param name="Range"></param>
    ''' <param name="Mode"></param>
    ''' <remarks></remarks>
    Public Sub UnitDamageWave(ByVal Damage As Integer, ByVal Range As Integer, ByVal Mode As UnitDamageModeWave)
        Dim Schlachtfelder As Integer = ObjektSpielfeld.Bodenschlacht
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht Then Schlachtfelder = ObjektSpielfeld.Luftschlacht
        For Schlachtfeld = 0 To Schlachtfelder
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Hidden Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlachtfeld)
                        If E IsNot Nothing Then
                            If E.GetSpieler.Team <> GetSpieler.Team Then
                                Dim KOEinheit As ObjektEinheit = GetKOUnit()
                                Select Case Mode
                                    Case UnitDamageModeWave.CO_Zone
                                        If KOEinheit IsNot Nothing Then
                                            If E.GetDistance(KOEinheit) <= GetKORange() Then
                                                E.DoDamage(Damage)
                                            End If
                                        End If
                                    Case UnitDamageModeWave.No_Stack_All
                                        Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld)
                                        Do Until L Is Nothing
                                            Dim E2 As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(L.KooX, L.KooY, Schlachtfeld)
                                            If E2 IsNot Nothing Then
                                                If E2.Spieler = Spieler Then
                                                    E.DoDamage(Damage)
                                                    Exit Do
                                                End If
                                            End If
                                            L = Wegsuchsystem.getFeldRundrum(X, Y, Schlachtfeld, 0, Range, L, Objektverwalter.Spielfeld)
                                        Loop
                                    Case UnitDamageModeWave.Stack_All
                                        Dim Damage2 As Integer = 0
                                        Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld)
                                        Do Until L Is Nothing
                                            Dim E2 As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(L.KooX, L.KooY, Schlachtfeld)
                                            If E2 IsNot Nothing Then
                                                If E2.Spieler = Spieler Then
                                                    Damage2 += Damage
                                                End If
                                            End If
                                            L = Wegsuchsystem.getFeldRundrum(X, Y, Schlachtfeld, 0, Range, L, Objektverwalter.Spielfeld)
                                        Loop
                                        E.DoDamage(Damage2)
                                End Select
                            End If
                        End If
                    End If
                Next
            Next
        Next

    End Sub
    Public Function GetSpieler() As ObjektSpieler
        Return Objektverwalter.Spielfeld.Spieler(Spieler)
    End Function
#End Region
#Region "3D"

    Public Function getLichtfarbe() As Color
        Select Case Gabemodus
            Case Gabemodi.Doppelgabe
                Return LichtfarbeDoppel
            Case Gabemodi.Spezialgabe
                Return LichtfarbeSpezial
            Case Gabemodi.Gabe
                Return LichtfarbeGabe
            Case Else
                Return LichtfarbeNormal
        End Select
    End Function
#End Region
End Class
